import app from '@/app'
import { query, update } from '@/api/provider/reports'

export default class {

  constructor(type, time) {
    // 表单
    this.form = {type, time}

    // 数据
    this.year = {} 
    this.month = []
    this.quarter = []
    this.day = []

    // 多线程
    this.task = app.task(2)
  }

  // 类型
  getType() {
    return this.form.type
  }

  // 年的时间
  startTime() {
    return app.time.parse(this.form.time)
  }

  // 数据截止时间
  endTime() {
    return this.startTime().addDay(this.day.length)
  }

  // 现在时间
  nowTime() {
    return this.startTime().yearEnd().today()
  }

  dayList(start, end) {
    const time = []
    while(!start.isAfter(end)) {
      time.push([
        start.dayStart().raw(),
        start.dayEnd().raw(),
      ])
      start.addSecond(1)
    }
    return time
  }

  // 获取数据
  async get() {
    const data = await query(this.form)
    this.year = data.year
    this.month = data.month
    this.quarter = data.quarter
    this.day = data.day
  }

  // 拉取数据
  async pull(func) {
    // 创建统计
    this.create()

    // 拉取需要统计的天
    const dayList = this.dayList(this.endTime(), this.nowTime())

    // 执行钩子
    await this.before()

    // 循环
    for (let index = 0; index < dayList.length; index++) {
      // 初始化数据
      const start = app.time.load(dayList[index][0])
      const end = app.time.load(dayList[index][1])
      const data = {}
      // 多任务获取数据
      await this.task.run(this.getData(start, end, data))
      // 插入数据进行占位
      this.add(start, data)
      // 进度
      func(dayList.length, index)
    }

    // 完成多任务
    await this.task.over()
    // 统计
    this.total()
    // 更新
    await this.update()
    // 完成进度
    func(dayList.length, dayList.length)
  }

  async before() {

  }

  // 创建统计
  create() {
    // 当前时间
    const time = this.nowTime()
    this.year = {}
    this.quarter = []
    this.month = []

    // 原数据量减 1 天，只为能刷新数据的最后一天
    this.day.pop()

    // 使用结束时间取出最大月和最大季度
    for(var i = 0; i <= time.quarter(); i++) {
      this.quarter.push({})
    }
    for(var i = 0; i <= time.month(); i++) {
      this.month.push({})
    }
  }

  // 插入数据
  add(time, data) {
    // 插入天
    this.day.push(Object.assign(data, {
      id: [time.quarter(), time.month(), time.day()]
    }))
  }

  // 更新数据
  async update() {
    await update(Object.assign({ 
      year: this.year,
      month: this.month,
      quarter: this.quarter,
      day: this.day, 
      count: this.day.length,
    }, this.form))
  }

  // 查询天的数据
  getDayList({month = null, quarter = null}) {
    return this.day.filter(item => {
      if(quarter != null && item.id[0] != quarter) {
        return false
      }
      if(month != null && item.id[1] != month) {
        return false
      }
      return true
    })
  }

  // 查询指定的天
  getDay(month, day) {
    // 使用月日来核对
    return this.day.find(item => item.id[1] == month && item.id[2] == day)
  }

  // 查询时间
  getDayTime(data) {
    return app.time.parse(this.form.time, data.id[1], data.id[2])
  }
}